#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
int n,m,stac[MAXN],top,nxt[MAXN];
struct node
{
	int c[2],fa,siz;
	bool rev;
}a[MAXN];
void push_up(int o)
{
	a[o].siz=a[a[o].c[0]].siz+a[a[o].c[1]].siz+1;
	return;
}
void push_down(int o)
{
	if(a[o].rev)
	{
		a[a[o].c[0]].rev^=1;
		a[a[o].c[1]].rev^=1;
		swap(a[o].c[0],a[o].c[1]);
		a[o].rev=0;
	}
	return;
}
bool isroot(int o)
{
	return a[a[o].fa].c[0]!=o&&a[a[o].fa].c[1]!=o;
}
void rotate(int x)
{
	int y=a[x].fa,z=a[y].fa,dy=a[y].c[1]==x,dz=a[z].c[1]==y;
	if(!isroot(y))a[z].c[dz]=x;
	a[y].c[dy]=a[x].c[dy^1];
	a[a[x].c[dy^1]].fa=y;
	a[x].c[dy^1]=y;
	a[y].fa=x;
	a[x].fa=z;
	push_up(y);
	return;
}
void splay(int x)
{
	stac[top=1]=x;
	for(int i=x;!isroot(i);i=a[i].fa)
		stac[++top]=a[i].fa;
	while(top)
		push_down(stac[top--]);
	while(!isroot(x))
	{
		int y=a[x].fa,z=a[y].fa;
		if(!isroot(y))
		{
			if(a[y].c[1]==x^a[z].c[1]==y)rotate(x);
			else rotate(y);
		}
		rotate(x);
	}
	push_up(x);
	return;
}
void access(int o)
{
	for(int i=0;o;i=o,o=a[o].fa)
	{
		splay(o);
		a[o].c[1]=i;
	}
	return;
}
void makeroot(int o)
{
	access(o);
	splay(o);
	a[o].rev^=1;
	return;
}
int findroot(int o)
{
	access(o);
	splay(o);
	while(a[o].c[0])o=a[o].c[0];
	return o;
}
void link(int x,int y)
{
	makeroot(x);
	a[x].fa=y;
	return;
}
void cut(int x,int y)
{
	makeroot(x);
	access(y);
	splay(y);
	a[y].c[0]=a[x].fa=0;
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		int x;
		scanf("%d",&x);
		a[i].siz=1;
		a[i].fa=nxt[i]=min(i+x,n+1);
	}
	scanf("%d",&m);
	while(m--)
	{
		int x,y,z;
		scanf("%d",&x);
		if(x==1)
		{
			scanf("%d",&y);
			++y;
			makeroot(n+1);
			access(y);
			splay(y);
			printf("%d\n",a[y].siz-1);
		}
		else
		{
			scanf("%d%d",&y,&z);
			++y;
			cut(nxt[y],y);
			nxt[y]=min(y+z,n+1);
			link(nxt[y],y);
		}
	}
	return 0;
}
